"""

    并发运行任务 - wait - FIRST_COMPLETED

"""
import asyncio
import random

import aiohttp
from async_web import async_timed, fetch_status


async def delay(seconds):
    print(f"sleep for {seconds} seconds")
    await asyncio.sleep(seconds)


@async_timed()
async def main():
    async with aiohttp.ClientSession() as session:
        pending = [
            asyncio.create_task(fetch_status(session, "http://www.baidu.com")),

            asyncio.create_task(fetch_status(session, "http://www.baidu.com")),

            asyncio.create_task(fetch_status(session, "http://www.baidu.com")),
        ]
        while pending:
            done, pending = await asyncio.wait(pending, return_when=asyncio.FIRST_COMPLETED)
            """
                asyncio.ALL_COMPLETED : 
                    默认，挂起的集合为0，要一切都完成后才返回，
                    中间遇到异常，也得等任务完成后，才会看到异常消息
                    在协程成功不抛异常的情况下，必须等所有协程执行完成
                asyncio.FIRST_EXCEPTION
                    中间任何任务抛出异常，wait将立即返回。
                    在协程成功不抛异常的情况下，必须等所有协程执行完成
                asyncio.FIRST_COMPLETED
                    协程至少有一个结果时，立即返回，可以是失败的协程，也可以是成功的协程
                    然后可以取消其他正在运行的协程
                    
            """

            print(f"完成的数量:{len(done)}")
            print(f"等待的数量:{len(pending)}")

            for done_task in done:
                print(await done_task)


asyncio.run(main())
